﻿#ifndef __SS_LE_SESSION_H__
#define __SS_LE_SESSION_H__
#include "ssBaseDefine.h"
#include "../ssServerErrorDefine.h"
#include "time/ssTime.h"
#include <event2/bufferevent.h>

namespace StarSeeker
{

class ssLeServer;

class ssLeSession
{
	friend class ssLeServer;
	friend class ssLeServerThread;
	friend class ssLeNetwork;
public:
	ssLeSession();
	~ssLeSession();

	//重置
	void Init(ssLeServer* pServer, u32 id, bufferevent* buf, evutil_socket_t fd, sockaddr* addr);
	//收包间隔检测 @启用功能 @间隔时间（毫秒）@临界次数
	void SetTimeCheck(bool timeCheck, i64 intervalTime=100, u16 checkCount=40);
	//发送(le线程调用，否则可能有线程问题)
	bool SendData(const void* data, const u32 len);
	//关闭连接(le线程调用，否则可能有线程问题)
	void Close();
	//收数据(le线程调用，否则可能有线程问题)
	char* BevRead(evbuffer *input, u32 len);
	//关闭连接通知
	void PostClose(u32 reason);

private:
	//间隔检查
	void OnTimeCheck(u16 fastCount);
	//分析数据包
	char* ParseData(evbuffer *input);


	bool					m_timeCheck;	//是否检测收包间隔
	i64						m_intervalTime;	//收包间隔,毫秒
	i64						m_lastTime;		//上次收包时间,毫秒
	u16						m_fastCount;	//频繁次数,超过20次无视，超过40次断线
	u16						m_checkCount;	//超过这个次数就触发事件
	bool					m_isConnect;
	u32						m_sessionID;
	ssLeServer*			m_pServer;
	struct bufferevent*		m_buffer;
	evutil_socket_t			m_fd;
	sockaddr				m_addr;
};

}
#endif
